package com.example.quartz;
 
import cn.hutool.core.date.DateUtil;
import com.example.mapper.TJobMapper;
import com.example.util.InvokeUtil;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;

/**
 * @author ccc
 */
@Slf4j
public class QuartJob implements Job {

    @Autowired
    private TJobService jobService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        try {
            before(context);
            doExecute(context);
            after(context, null);
        } catch (Exception e) {
            log.error("定时任务执行失败：" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
            after(context, e);
        }
    }
 
    /**
     * 执行前
     *
     * @param context 工作执行上下文对象
     */
    protected void before(JobExecutionContext context) {
        log.info("开始执行定时任务：" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
    }
 
    /**
     * 执行后
     *
     * @param context 工作执行上下文对象
     */
    protected void after(JobExecutionContext context, Exception e) {
        //获取JobDetail中关联的数据
        TJob job = (TJob) context.getJobDetail().getJobDataMap().get("job");
        job.setStatus(false);
        jobService.updateById(job);
        log.info("定时任务执行结束:" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
    }
 
    /**
     * 执行方法
     *
     * @param context 工作执行上下文对象
     * @throws Exception 执行过程中的异常
     */
    protected void doExecute(JobExecutionContext context) throws Exception {
        //获取JobDetail中关联的数据
        TJob job = (TJob) context.getJobDetail().getJobDataMap().get("job");
        log.info("执行定时任务："+job.getJobName());
        log.info("执行方法："+job.getExecuteTarget());
        //立即执行
        InvokeUtil.invokeMethod(job);
        System.out.println("当前时间 :" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss") + "\n任务名(" + job.getJobName()+")");
    }
}